package com.shopping.huaju.commodity.controller;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

//import org.apache.shiro.authz.annotation.RequiresPermissions;
import com.shopping.huaju.common.valid.SaveGroup;
import com.shopping.huaju.common.valid.UpdateGroup;
import com.shopping.huaju.common.valid.UpdateIsShow;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.shopping.huaju.commodity.entity.BrandEntity;
import com.shopping.huaju.commodity.service.BrandService;
import com.shopping.huaju.common.utils.PageUtils;
import com.shopping.huaju.common.utils.R;



/**
 * 家居品牌
 *
 * @author tofu
 * @email tofu@qq.com
 * @date 2023-11-04 16:55:06
 */
@RestController
@RequestMapping("commodity/brand")
public class BrandController {
    @Autowired
    private BrandService brandService;

    /**
     * 列表
     */
    @RequestMapping("/list")
    //@RequiresPermissions("commodity:brand:list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = brandService.queryPage(params);

        return R.ok().put("page", page);
    }


    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    //@RequiresPermissions("commodity:brand:info")
    public R info(@PathVariable("id") Long id){
		BrandEntity brand = brandService.getById(id);
        System.out.println(brand);
        return R.ok().put("brand", brand);
    }

    /**
     * 保存
     */
    @RequestMapping("/save")
    //@RequiresPermissions("commodity:brand:save")
    //@Validated 启动对封装的brandEntity对象的jsr303校验
    //bindingResult 校验结果封装到该对象中
    //每个方法出现数据校验错误都需要各自写一个 处理字段方法
    //优化-》使用全局异常处理，对指定的包内的指定异常/错误进行统一处理，使代码更加整洁，并且复用性更好
    // 使用全局异常处理可以对 异常返回数据进行统一的处理，即对每个异常都返回指定格式(Json)的错误信息，方便前端进行错误展示
    //注意 数据校验错误会抛出的错误是 MethodArgumentNotValidException异常
    //@Validated(SaveGroup.class)指定使用 Save 组的规则进行验证
    public R save(@Validated(SaveGroup.class) @RequestBody BrandEntity brand/*, BindingResult bindingResult*/){
        //if(bindingResult.hasFieldErrors()){
        //    //如果存在字段错误，将错误封装到map中，传递到前端
        //    Map<String, String> map = new HashMap<>();
        //    bindingResult.getFieldErrors().forEach(fieldError -> {
        //        map.put(fieldError.getField(),fieldError.getDefaultMessage());
        //    });
        //    //返回提示到 前端
        //    return R.error(400,"品牌表数据不合法").put("data",map);
        //}else {
        //    //如果验证无误 入库，返回正确提示
        //    brandService.save(brand);
        //    return R.ok();
        //}
        /**
         * 1. 使用全局异常处理，如果@Validated校验错误 会抛出MethodArgumentNotValidException异常，
         * 并到全局处理器中执行相应的代码，不会执行到下面的代码
         * 2. 如果@Validated校验通过，则正常执行入库操作
         */
        brandService.save(brand);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    //@RequiresPermissions("commodity:brand:update")
    //@Validated(UpdateGroup.class)指定使用Update组的规则进行验证
    //当没指定对应组时，可以理解为，在规定校验规则时没指定对应组，即放在一个默认组
    //校验时，没指定使用哪一组校验规则，则使用默认组的规则
    public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){
		//brandService.updateById(brand);
        brandService.updateBrandAndRelation(brand);
        return R.ok();
    }

    /**
     * 解决使用开关切换 显示状态，由于只传id和isshow无法通过Update组校验的问题
     * 解决方法 分离出新的接口并创建修改isshow规则组进行校验
     * @param brand
     * @return
     */
    @RequestMapping("/update/isShow")
    //@RequiresPermissions("commodity:brand:update")
    //@Validated(UpdateGroup.class)指定使用Update组的规则进行验证
    //当没指定对应组时，可以理解为，在规定校验规则时没指定对应组，即放在一个默认组
    //校验时，没指定使用哪一组校验规则，则使用默认组的规则
    public R updateIsShow(@Validated(UpdateIsShow.class) @RequestBody BrandEntity brand){
        brandService.updateById(brand);
        return R.ok();
    }


    /**
     * 删除
     */
    @RequestMapping("/delete")
    //@RequiresPermissions("commodity:brand:delete")
    public R delete(@RequestBody Long[] ids){
		//brandService.removeByIds(Arrays.asList(ids));
        brandService.deleteBrandAndRelation(ids);
        return R.ok();
    }

    /**
     * 模拟出现正常的异常
     * @param params
     * @return
     */
    @RequestMapping("/testError")
    //shiro注解暂时不需要
    //@RequiresPermissions("commodity:category:list")
    public R testError(@RequestParam Map<String, Object> params){
        int i = 10/ 0;
        PageUtils page = brandService.queryPage(params);

        return R.ok().put("page", page);
    }
}
